package main

import (
	"encoding/base64"
	"flag"
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"path/filepath"
	"strings"
)

func main() {
	// 定义命令行参数
	inputDir := flag.String("input", "input", "输入的文件夹路径")
	flag.Parse()

	// 确保输入目录存在
	if _, err := os.Stat(*inputDir); os.IsNotExist(err) {
		log.Fatalf("输入目录不存在: %v", err)
	}

	// 创建输出目录
	outputDir := filepath.Join(*inputDir, "base64")
	if err := os.MkdirAll(outputDir, os.ModePerm); err != nil {
		log.Fatalf("无法创建输出目录: %v", err)
	}

	// 遍历输入目录中的所有文件和子目录
	err := filepath.Walk(*inputDir, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}

		if info.IsDir() {
			return nil
		}

		// 检查文件扩展名是否为图片
		ext := strings.ToLower(filepath.Ext(path))
		if ext != ".jpg" && ext != ".jpeg" && ext != ".png" {
			return nil
		}

		// 读取图片文件
		imgData, err := ioutil.ReadFile(path)
		if err != nil {
			log.Printf("无法读取文件 %s: %v", path, err)
			return nil
		}

		// 将图片数据转换为 Base64 格式
		base64Data := base64.StdEncoding.EncodeToString(imgData)

		// 构建输出文件路径
		relativePath, err := filepath.Rel(*inputDir, path)
		if err != nil {
			log.Printf("无法获取相对路径 %s: %v", path, err)
			return nil
		}
		outputPath := filepath.Join(outputDir, relativePath)

		// 确保输出目录存在
		outputDirPath := filepath.Dir(outputPath)
		if err := os.MkdirAll(outputDirPath, os.ModePerm); err != nil {
			log.Printf("无法创建输出目录 %s: %v", outputDirPath, err)
			return nil
		}

		// 更改输出文件扩展名为 .txt
		outputPath = changeFileExtensionTxt(outputPath, ".txt")

		// 保存 Base64 数据到文件
		if err := saveBase64ToFile(outputPath, base64Data); err != nil {
			log.Printf("无法保存 Base64 数据到文件 %s: %v", outputPath, err)
			return nil
		}

		fmt.Printf("图片 %s 已转换为 Base64 并保存为 %s\n", path, outputPath)

		return nil
	})

	if err != nil {
		log.Fatalf("遍历文件夹时出错: %v", err)
	}

	fmt.Println("图片处理完成")
}

// saveBase64ToFile 将 Base64 数据保存到文件
func saveBase64ToFile(path, data string) error {
	file, err := os.Create(path)
	if err != nil {
		return err
	}
	defer file.Close()

	_, err = file.WriteString(data)
	if err != nil {
		return err
	}

	return nil
}

// changeFileExtensionTxt 更改文件扩展名
func changeFileExtensionTxt(path, ext string) string {
	ext = strings.ToLower(ext)
	if ext[0] != '.' {
		ext = "." + ext
	}
	dir, file := filepath.Split(path)
	extOnly := filepath.Ext(file)
	file = file[:len(file)-len(extOnly)] + ext
	return filepath.Join(dir, file)
}
